/* ** por compatibilidad se omiten tildes **
================================================================================
 TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
================================================================================
  definicion de las rutinas de atencion de interrupciones
*/

#include "defines.h"
#include "idt.h"
#include "isr.h"

#include "tss.h"

idt_entry idt[255] = {};

idt_descriptor IDT_DESC = {
    sizeof(idt) - 1,
    (unsigned int) &idt
};

/*
    La siguiente es una macro de EJEMPLO para ayudar a armar entradas de
    interrupciones. Para usar, descomentar y completar CORRECTAMENTE los
    atributos y el registro de segmento. Invocarla desde idt_inicializar() de
    la siguiene manera:
*/


#define IDT_ENTRY(n)                                                                                        \
    idt[n].offset_0_15 = (unsigned short) ((unsigned int)(&_isr ## n) & (unsigned int) 0xFFFF);        \
    idt[n].segsel = (unsigned short) 0x48;                                                                  \
    idt[n].attr = (unsigned short) 0x8e00;    /* 0x8e00 1110 1110 0000 0000  estamos tocando los primeros 5 bits reservados*/\
   idt[n].offset_16_31 = (unsigned short) ((unsigned int)(&_isr ## n) >> 16 & (unsigned int) 0xFFFF);



void idt_inicializar_() {

	IDT_ENTRY(0);
	IDT_ENTRY(1);
	IDT_ENTRY(2);
        IDT_ENTRY(3);
        IDT_ENTRY(4);
        IDT_ENTRY(5);
        IDT_ENTRY(6);
        IDT_ENTRY(7);
        IDT_ENTRY(8);
        IDT_ENTRY(9);
        IDT_ENTRY(10);
        IDT_ENTRY(11);
        IDT_ENTRY(12);
        IDT_ENTRY(13);
        IDT_ENTRY(14);
        IDT_ENTRY(15);
        IDT_ENTRY(16);
        IDT_ENTRY(17);
        IDT_ENTRY(18);
        IDT_ENTRY(19);
	IDT_ENTRY(32);
	IDT_ENTRY(33);
	IDT_ENTRY(0x52);

	idt[33].attr = 0xee00;	
	idt[82].attr = 0xee00;


}


unsigned int idt_inicializar() {
    // Excepciones
    return (unsigned int)tss_tanques;
}
